/**
 *
 */
package com.cs.paoyer.common.exception;



import javax.ejb.EJBException;




/**
 * Representa una excepci�n que se genera exclusivamente
 * por un comportamiento no deseado de la aplicaci�n.
 *
 * Esta clase se crea cuando, por ejemplo, la comunicaci�n con alg�n sub-sistema
 * se ve interrumpida inesperadamente.
 *
 * @version 0.9.1
 */
public class BaseException extends EJBException{

    /**
     * Nombre de la Clase Excepcion correspondiente al modulo
     */
    protected ModuleVO moduleVO;

    /**
     * Identificador de la Excepcion dentro del Modulo
     */
    protected int messageId;

    /**
     * Mensaje personalizado de error.
     */
    protected String customMessage;

    /**
     * Constructores.
     */
    public BaseException() {
    }

    public BaseException(String s) {
      super(s);
    }

    public BaseException(ModuleVO moduleVO, int messageId) {
        this(moduleVO, messageId, null);
    }

    public BaseException(ModuleVO moduleVO, int messageId,
                           String customMessage) {
      super(ModuleExceptionFactory.getModuleException(moduleVO.
        getExceptionClass()).getExceptionVO(messageId).toString() +
        "Mensaje Personalizado = " + customMessage);

      this.moduleVO      = moduleVO;
      this.messageId     = messageId;
      this.customMessage = customMessage;
    }

    /**
     * Devuelve el mensaje personalizado guardado para una excepci�n.
     * @return String
     */
    public String getCustomMessage() {
      return this.customMessage;
    }


    /**
     * Devuelve informaci�n detallada de una excepci�n, representada en un objeto
     * ExceptionVO.
     * @return ExceptionVO
     */
    public ExceptionVO getExceptionVO() {
      //Solicita una ModuleException de tipo User
      try {
        ModuleExceptionInterface exception = null;
        exception = ModuleExceptionFactory.
          getModuleException(this.moduleVO.getExceptionClass());

        return exception.getExceptionVO(this.messageId);
      } catch (BaseException ex) {
        return new ExceptionVO(CommonSystemException.IDENTIFY_EXCEPTION_NOT_FOUND,
                               "", "");
      }
    }


    /**
     * Devuelve s�lo un mensaje sobre la excepci�n en cuesti�n.
     * @return String
     */
    public String getMessage() {
      String messageInitialToken = " ME=[[";
      String finalToken = "]] ";
      String javaExceptionString = "";
      String customMessageString = "";

      try {
        //Solicita una ModuleException de tipo System
        ModuleExceptionInterface exception = ModuleExceptionFactory.
          getModuleException(this.moduleVO.getExceptionClass());

        if (this.customMessage != null) {
          customMessageString = messageInitialToken +
            this.customMessage + finalToken;
        }

        return exception.getExceptionVO(this.messageId).toString() +
          customMessageString;
      } catch (ExceptionIdNotFound ex) {
         return ex.toString();
      } catch (BaseException ex) {
         return ex.getExceptionVO().toString();
      }
    }
}